/*
 * 作者: junmu
 * 时间: 2025-07-22
 */
package com.hzbc.faceattendance.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.persistence.*;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.Collections;
import java.util.Date;

@Entity
@Table(name = "admin_users")
@Data
public class AdminUser implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // 用户唯一标识ID

    @Column(nullable = false, unique = true)
    private String username; // 用户名，用于登录，必须唯一
    //    @JsonIgnore
    @Column(nullable = false)
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password; // 用户密码，加密存储

    @Column(nullable = false)
    private Integer role; // 用户角色：1(管理员), 2(安全员)

    @Column(nullable = false, columnDefinition = "integer default 1")
    private Integer onDuty = 1; // 1(在 duty), 0(不在 duty)

    @Column(nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    @CreationTimestamp  // 新增：创建时自动设置时间
    private Date createTime;
    @Column(nullable = false)
    private Integer status;// 1(正常), 0(禁用)


    @Column(nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    @UpdateTimestamp  // 新增：更新时自动设置时间
    private Date updateTime;
    // 保持现有getter/setter不变





    /**
     * 获取用户权限集合
     * 实现UserDetails接口要求的方法
     * 将用户角色转换为Spring Security可识别的权限标识
     *
     * @return 包含单个权限的集合，格式为"ROLE_角色值"(如ROLE_1, ROLE_2等)
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return Collections.singleton(() -> "ROLE_" + role);
    }

    /**
     * 检查账户是否未过期
     * 实现UserDetails接口要求的方法
     *
     * @return 总是返回true，表示账户永不过期
     * 可根据业务需求修改为从数据库字段判断
     */
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     * 检查账户是否未被锁定
     * 实现UserDetails接口要求的方法
     *
     * @return 总是返回true，表示账户永不被锁定
     * 实际业务中可结合locked字段实现账户锁定功能
     */
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    /**
     * 检查账户是否未被锁定
     * 实现UserDetails接口要求的方法
     *
     * @return 总是返回true，表示账户永不被锁定
     * 实际业务中可结合locked字段实现账户锁定功能
     */
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     * 检查账户是否未被锁定
     * 实现UserDetails接口要求的方法
     *
     * @return 总是返回true，表示账户永不被锁定
     * 实际业务中可结合locked字段实现账户锁定功能
     */
    @Override
    public boolean isEnabled() {
        return true;
    }

    @Column
    private String wcOpenId; // 微信公众号用户的唯一标识openid
    // 微信相关字段的驼峰命名需要明确指定

    @Column
    private String appOpenId; // 微信小程序用户的唯一标识openid
    @Column
    private String unionId; // 微信小程序公众号关联id
    @Column
    private String nickname; // 用户在微信的昵称

    @Column
    private String avatarUrl; // 用户在微信的头像URL地址

    @Column
    private Long classId; // 用户所属班级ID

}